package main

import (
	"fmt"
	"time"
)

/*
channel: 是go routine和go routine之间的交互通道
*/
func chanDefine() {
	//方式一:
	//表示是 chan 类型(管道/通道), 接收 int 类型数据
	//这种定义方式只是定义, 没有初始化, 后续和 select 匹配使用
	//var c chan int

	//方式二:
	// 使用 make 进行初始化
	c := make(chan int)
	//注意: channel 创建后, 有生产者的同时, 必须有消费者, 否则会死锁
	// fatal error: all goroutines are asleep - deadlock!

	// -------- 注释这段会死锁 --------
	//消费端, 通过启动 goroutine 进行消费
	go func() {
		for true {
			n := <-c
			fmt.Println("goroutine 接收到的数据: ", n)
		}
	}()
	// -------- 注释这段会死锁 --------

	//生产端
	c <- 1
	c <- 2
	//字符 char 为在 ASCII 编码中的数值值
	c <- 'A'
	c <- 'a'
	c <- '#'

	//为了防止进程结束直接退出, 导致打印没有全部输出, 睡眠一会儿
	time.Sleep(time.Millisecond)
}

func main() {
	chanDefine()
}
